package com.zhuang.stringtable;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class TestString {

	public static void main(String[] args) throws Throwable {
		test01();
		test02();
		test03();
		test04();
		test05();
		test06();
	}

	public static void test01() {
		String s1 = "abc"; // 字符串对象 "abc"
		String s2 = "abc"; // 字符串对象 "abc"
		System.out.println(s1 == s2); // true
	}

	public static void test02() {
		String s1 = "a";
		String s2 = "abc";
		System.out.println(s1 == s2); // false
	}

	public static void test03() {
		String s1 = "a" + "b";
		final String x1 = "b";
		String s2 = "a" + x1;
		String x2 = "b";
		String s3 = "a" + x2;
		System.out.println(s1 == s2); // true

		// 本质上就是根据 StringBuilder 维护的 char[] 创建了新的 String 对象
		System.out.println(s1 == s3); // false

		System.out.println(s2 == s3); // false
	}

	public static void test04() throws Throwable {
		String x = "hello,";
		String y = "world";
		MethodHandle mh = MethodHandles.lookup().findStatic(TestString.class, "concat",
				MethodType.methodType(String.class, String.class, String.class));
		String s = (String) mh.invoke(x, y);
		System.out.println(s);
	}

	// 野生和家养的测试
	public static void test05() {
		String x = new String(new char[] { 'a', 'b', 'c' }); // 野生的
		String y = "abc"; // 将 "abc" 加入 StringTable
		String z = x.intern(); // 已有，返回 StringTable 中 "abc"，即 y
		System.out.println(z == y); // true
		System.out.println(z == x); // false
	}

	// 野生和家养的测试
	public static void test06() {
		String x = new String(new char[] { 'a', 'b', 'c' }); // 野生的
		String z = x.intern(); // 野生的 x 加入 StringTable，StringTable 中有了 "abc" // 家养
		String y = "abc"; // 已有，不会产生新的对象，用的是 StringTable 中 "abc" // 家养
		System.out.println(z == x); // false
		System.out.println(z == y); // true
	}

	public static String concat(String x, String y) {
		return new StringBuilder().append(x).append(y).toString();
	}
}
